package pe.gob.osce.sirenas.dao.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import pe.gob.osce.sirenas.dao.ComunicacionesDAOLocal;
import pe.gob.osce.sirenas.model.AcreditacionDTO;
import pe.gob.osce.sirenas.model.jpa.Comunicaciones;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;

@Stateless
public class ComunicacionesDAOImpl implements ComunicacionesDAOLocal {

	@PersistenceContext(unitName="pe.gob.osce.sirenas.be.pu" )
	private	EntityManager	em;

	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);
	@Override
	public Comunicaciones insertar(Comunicaciones comunicaciones ) throws Exception {
		try {
			comunicaciones=em.merge(comunicaciones);
			em.flush();
		} catch (Exception e) {
			comunicaciones=null;
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
			
		return comunicaciones;
	}

	@Override 
	public Comunicaciones consultarComunicacion(Long idPersona,Long indTipoComunicacion )
			throws Exception {
		Comunicaciones		comunicacionJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT com FROM Comunicaciones com WHERE com.idPersona= :idPersona  AND  com.indTipoComunicacion = :indTipoComunicacion AND com.estado=1");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idPersona", idPersona);
			query.setParameter("indTipoComunicacion", indTipoComunicacion);
			
			Comunicaciones  objetoJPA=(Comunicaciones)query.getSingleResult();
			comunicacionJPA=objetoJPA;

		} catch (NoResultException nre) {
			comunicacionJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		
		return comunicacionJPA;
	}	
	
	@Override 
	public Comunicaciones obtenterComunicacionId(Long idComunicacion )
			throws Exception {
		Comunicaciones		comunicacionJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT com FROM Comunicaciones com WHERE com.idComunicaciones= :idComunicacion AND com.estado=1");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idComunicacion", idComunicacion);
			
			
			Comunicaciones  objetoJPA=(Comunicaciones)query.getSingleResult();
			comunicacionJPA=objetoJPA;

		} catch (NoResultException nre) {
			comunicacionJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return comunicacionJPA;
	}	
	
	
	@Override 
	public List<Comunicaciones> consultarListaComunicacion(Long idPersona,Long indTipoComunicacion, Long indTipoComunicacionDos )
			throws Exception {
		List<Comunicaciones>		listComunicacionJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT com FROM Comunicaciones com WHERE com.idPersona= :idPersona  AND  com.indTipoComunicacion IN ( :indTipoComunicacion, :indTipoComunicacionDos )");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idPersona", idPersona);
			query.setParameter("indTipoComunicacion", indTipoComunicacion);
			query.setParameter("indTipoComunicacionDos", indTipoComunicacionDos);
			
			List<Comunicaciones>  listaObjetoJPA=query.getResultList();
			
			if(!listaObjetoJPA.isEmpty()) {
				listComunicacionJPA=new ArrayList<Comunicaciones>();
				for (Comunicaciones obj: listaObjetoJPA) {					
					listComunicacionJPA.add(obj);
				}				
			}

		} catch (NoResultException nre) {
			listComunicacionJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		
		return listComunicacionJPA;
	}
	
	@Override 
	public List<Comunicaciones> consultaHistorialComunicaciones(Long idPersona )
			throws Exception {
		List<Comunicaciones>	listComunicacionJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT com FROM Comunicaciones com WHERE com.idPersona= :idPersona AND com.estado=0 ");
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idPersona", idPersona);
						
			List<Comunicaciones>  listaObjetoJPA=query.getResultList();
			
			if(!listaObjetoJPA.isEmpty()) {
				listComunicacionJPA=new ArrayList<Comunicaciones>();
				for (Comunicaciones obj: listaObjetoJPA) {					
					listComunicacionJPA.add(obj);
				}				
			}

		} catch (NoResultException nre) {
			listComunicacionJPA=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listComunicacionJPA;
	}	
	
	
	
}
